## Evaluates the hex writer behavior with empty sections and segments.
##
## Show that the presence of an empty section placed at the same address of a
## filled section doesn't affect the hex output. Also, show that the presence of
## an empty section placed behind the filled section doesn't affect the hex
## output. And, show that this happens regardless of the section ordering in the
## section header table. (Two filled sections, and four empty sections, to
## realize this test.)
##
## Then, show the same kind of behaviors for segments. (One filled section, four
## empty sections, each in a single segment.)

# RUN: yaml2obj %s -o %t
# RUN: llvm-objcopy -O ihex %t - | FileCheck %s --implicit-check-not={{.}}

## .data0 address
# CHECK:         :02000004333394
## .data0 offset, contents, checksum
# CHECK-NEXT:    :020000000123DA

## .data1 address
# CHECK-NEXT:    :02000004444472
## .data1 offset, contents, checksum
# CHECK-NEXT:    :02000000456752

## .data2 address
# CHECK-NEXT:    :0200000477770C
## .data2 offset, contents, checksum
# CHECK-NEXT:    :0200000089ABCA

## End of file
# CHECK-NEXT:    :00000001FF

--- !ELF
FileHeader:
  Class:           ELFCLASS32
  Data:            ELFDATA2LSB
  Type:            ET_EXEC
  Machine:         EM_ARM
Sections:
## An empty section that's placed at the same address as a populated section.
## This won't be in the output. It also won't affect how the subsequent section
## is written.
  - Name:          .empty_at_data0
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x33330000
    Size:          0
## A section populated with data. This is in the output.
  - Name:          .data0
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x33330000
    Content:       "0123"
## An empty section that's placed at the end of .data0. This won't be in the
## output.
  - Name:          .empty_behind_data0
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x33330002
    Size:          0
## An empty section declared before .data1, but placed behind .data1. This
## won't be in the output.
  - Name:          .empty_behind_data1
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x44440002
    Size:          0
## A section populated with data. This is in the output.
  - Name:          .data1
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x44440000
    Content:       "4567"
## An empty section declared after .data1, but placed at the start of .data1.
## This won't be in the output.
  - Name:          .empty_at_data1
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x44440000
    Size:          0
## An empty section that's isolated (by address) from all others. This won't be
## in the output.
  - Name:         .empty_isolated
    Type:         SHT_PROGBITS
    Flags:        [ SHF_ALLOC ]
    Address:      0x7FFFFFFF
    AddressAlign: 0x1
    Size:         0
## The sections below are placed into segments of varying configurations.
## Populated section in its own segment. This is in the output.
  - Name:          .data2
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x77770000
    Content:       "89AB"
## Empty section in its own segment. That segment is declared before the .data2
## segment in the program headers, and placed at an address just behind .data2.
## This won't be in the output.
  - Name:          .empty0
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x88880000
    Size:          0
## Empty section in its own segment. That segment is declared before the .data2
## segment in the program headers, and placed at the same address as .data2.
## This won't be in the output.
  - Name:          .empty1
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0x99990000
    Size:          0
## Empty section in its own segment. That segment is declared after the .data2
## segment in the program headers, and placed at the same address as .data2.
## This won't be in the output.
  - Name:          .empty2
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0xAAAA0000
    Size:          0
## Empty section in its own segment. That segment is declared after the .data2
## segment in the program headers, and placed at an address just behind .data2.
## This won't be in the output.
  - Name:          .empty3
    Type:          SHT_PROGBITS
    Flags:         [ SHF_ALLOC ]
    Address:       0xBBBB0000
    Size:          0
ProgramHeaders:
## .data0 sections, with empty bookends.
  - Type:          PT_LOAD
    Flags:         [ PF_R ]
    PAddr:         0x33330000
    VAddr:         0x33330000
    FirstSec:      .empty_at_data0
    LastSec:       .empty_behind_data0
## .data1 sections, with empty bookends.
  - Type:          PT_LOAD
    Flags:         [ PF_R ]
    PAddr:         0x44440000
    VAddr:         0x44440000
    FirstSec:      .empty_behind_data1
    LastSec:       .empty_at_data1
## .empty_isolated section.
  - Type:          PT_LOAD
    Flags:         [ PF_R ]
    PAddr:         0x7FFFFFFF
    VAddr:         0x7FFFFFFF
    FirstSec:      .empty_isolated
    LastSec:       .empty_isolated
## Segments below include a single empty segment, and are positioned around
## .data2 in various ways.  Declared before, placed behind .data2 segment.
  - Type:          PT_LOAD
    Flags:         [ PF_R ]
    PAddr:         0x77770002
    VAddr:         0x77770002
    FirstSec:      .empty0
    LastSec:       .empty0
## Declared before, placed at .data2 segment.
  - Type:          PT_LOAD
    Flags:         [ PF_R ]
    PAddr:         0x77770000
    VAddr:         0x77770000
    FirstSec:      .empty1
    LastSec:       .empty1
## Segment for .data2.
  - Type:          PT_LOAD
    Flags:         [ PF_R ]
    PAddr:         0x77770000
    VAddr:         0x77770000
    FirstSec:      .data2
    LastSec:       .data2
## Declared after, placed at .data2 segment.
  - Type:          PT_LOAD
    Flags:         [ PF_R ]
    PAddr:         0x77770000
    VAddr:         0x77770000
    FirstSec:      .empty2
    LastSec:       .empty2
## Declared after, placed behind .data2 segment.
  - Type:          PT_LOAD
    Flags:         [ PF_R ]
    PAddr:         0x77770002
    VAddr:         0x77770002
    FirstSec:      .empty3
    LastSec:       .empty3
